package com.season.seasonStudy.javase.j_013_innerClass;

import com.season.other.entity.Pet;
import com.season.seasonStudy.javase.j_013_innerClass.Users.JiSuanQi;

/**
 * 内部类：
 * 		类内定义另一个类
 * 		使用：
 * 			内部类方法直接调用外部类属性方法
 * 			外部类方法，创建内部类对象，使用对象的非静态属性方法
 * 					   内部类.内部类的静态方法属性
 * 			其他类调用时使用外部类对象.new 内部类（）的方式创建内部类对象
 * 			 
 * 		静态内部类：直接且只能调用外部类的静态方法和属性
 * 				其他类调用时使用new 外部类类名.内部类类名();
 * 			外部类的静态方法只能调用静态内部类的属性和方法
 * 
 * 匿名内部类：(经常用的实现类还是创建比较好)
 * 			(经常变得实现类使用该方式)
 * 		在使用接口时通过
 * 	接口 名=new 接口（）{实现抽象方法，完成匿名实现类};
 * 	名.接口方法（）
 * 	
 * 打印机（墨盒和纸张）
 * 	
 * 
 * */

/**
 * -------------------------------------------------------------------------
 * 内部类：
 * 		定义：在一个类的内部再定义一个类（不是并列的）
 * 		
 * 		用法：外面调里里面   里面调外面
 * 内部类调外部类属性、方法随便调、直接调
 * 外部类方法.创建内部类对象，再调用（使用对象的属性方法）
 * 
 * 静态内部类
 * 		直接  且  只能   调用外部类的静态方法和属性
 * 			其他类调用时  使用new 外部类名.内部类类名();
 * 		外部类是静态方法   只能调用  静态内部类
 * 加了static对外面来说只是相对的
 * 
 * 有保护作用,private 就不能在用了,别人想用 我提供共有方法 
 * 
 * 内部类想让人家用,还不如放了外面, 吃饱了撑的
 * 想藏起来,那就private只能自己用
 * 
 * --------------------------------------------------------------------------
 * 重点   匿名内部类
 * 用起来灵活方便
 * 
 * 什么时候使用就去写, 实现	子类的特有的不能用
 * 但是不利于复用
 * 双面性的
 * 
 * 打印机(墨盒 ＆ 纸张)
 * 在使用接口时 
 * 
 */

public class InnerDemo {
	public static void show(Pet p) {
		//等量替换原则
	}
	
	
	public static void main(String[] args) {
		Pet p = new Pet() {
			
			@Override
			public void play() {
				// TODO Auto-generated method stub
				
			}
		};
		/*JiSuanQi jsq = new JiSuanQi();//报错了
		通过外部类的对象调用
		先杀鸡，再吃鸡心*/		
	//	Users u= new Users();
	//	JiSuanQi jsq = u.new JiSuanQi();
	//	JiSuanQi jsq = new Users.JiSuanQi();//调类是直接的，但是调方法是还用new对象
		JiSuanQi jsq = new JiSuanQi();
		
		//一般平private保护起来了，这种方法使用到很少
		jsq.num1=34;
		jsq.num2=99;
	}
	
	
	
}
